package com.jt.resource.controller;

import com.jt.resource.annotation.RequiredLog;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.Date;
import java.util.UUID;

@Slf4j
//@CrossOrigin//用于在controller层面处理跨域
@RefreshScope
@RestController
@RequestMapping("/resource")
public class ResourceController {

    @Value("${jt.resource.path:E:/cgb2106sijieduan/uploads/}")
    private String resourcePath;
    @Value("${jt.resource.host:http://localhost:8881/}")
    private String resourceHost;

//    @GetMapping("/{username}")
//    public String selectByUsername(@PathVariable String username){
//        return "select resource ok by "+username;
//    }

    /**
     * 通过此方法处理文件上传的请求
     * @param uploadFile  接收要上传的文件数据（参数名一定要与客户端提交的名字一样）
     * @return 文件上传以后在服务端的实际存储路径，可以基于hppt协议访问这个资源
     */
    @PreAuthorize("hasAuthority('sys:res:create')")
    @RequiredLog("文件上传")//此注解描述的方法为切入点方法
    @PostMapping("/upload/")//文件上传的请求方式必须是post
    public String uploadFile(MultipartFile uploadFile) throws IOException {

        //1.创建文件的存储目录（按年月日的结构进行存储）
        //1.1获取当前日期对应的字符串
        //方式一：
//        SimpleDateFormat sdf = new SimpleDateFormat("yyy/MM/dd");
//        String dateStr = sdf.format(new Date());

        //方式二：
        String dateStr =
            DateTimeFormatter.ofPattern("yyy/MM/dd").format(LocalDate.now());

        //1.2创建文件目录对象
        File uploadDir = new File(resourcePath, dateStr);
        if (!uploadDir.exists())uploadDir.mkdirs();

        //2.给文件一个新的名字（文件前缀随机产生，后缀不能变）
        //2.1获取原始文件名
        String originalFilename = uploadFile.getOriginalFilename();

        //2.2构建文件前缀
        String filePrefix = UUID.randomUUID().toString();
        String fileSuffix =
                originalFilename.substring(originalFilename.lastIndexOf("."));

        //2.3构建新文件名
        String newFileName = filePrefix+"."+fileSuffix;
        log.debug("newFileName {}",newFileName);

        //3.上传文件到指定目录
        uploadFile.transferTo(new File(uploadDir,newFileName));

        //4.返回通过http协议可以访问到这个文件的路径
        String accessAddress = resourceHost+dateStr+"/"+newFileName;
        log.debug("access address is {}",accessAddress);
        System.out.println(accessAddress);
        return accessAddress;


    }

}
